package com.my.screenadapter.utils;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Base64;

import com.ajie.lib_base.ft_file.FileIOUtils;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;

import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder;

/**
 * Created by ${张英杰} on 2019/1/4.
 * TODO 结论 method1 method2 结果一样。
 * method1 用的是 android.util 包下 endoder
 * method2 用的是 sun.misc.BASE64Decoder 下的方法
 *
 */

public class Base64Util {
    public static void main(String[] args) {
//        test
        //调用把图片转换为base64 数据方法	参数是需要转base64图片的路径
        String strImg =encodeImgBase64Two("./base64before.jpeg");
        //输出base64 数据
        System.out.println("data:image/png;base64,"+strImg);
        //调用把base64 数据转换为图片方法  第一个参数是字符串数据，第二个是转为图片存放的路径
        boolean b = decoderBase64ImageTwo(strImg, "./temp.jpeg");
    }
    /**
     * 将bitmap转换成base64字符串
     *
     * @param bitmap
     * @return base64 字符串
     */
    public static String encodeBitmapToString(Bitmap bitmap, int bitmapQuality) {
        // 将Bitmap转换成字符串
        String string = null;
        ByteArrayOutputStream bStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, bitmapQuality, bStream);
        byte[] bytes = bStream.toByteArray();
        string = Base64.encodeToString(bytes, Base64.DEFAULT);
        return string;
    }

    /**
     * 将base64转换成bitmap图片
     *
     * @param string base64字符串
     * @return bitmap
     */
    public static Bitmap decodeBase64StrToBitmap(String string) {
        // 将字符串转换成Bitmap类型
        Bitmap bitmap = null;
        try {
            byte[] bitmapArray;
            bitmapArray = Base64.decode(string, Base64.DEFAULT);
            bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.length);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bitmap;
    }

    /**
     *  String imgtype = "jpeg";
     *  c1.put("facePhoto","data:image/"+imgtype+";base64,"+imgStr);
     * @param filePath
     * @return
     * TODO method1
     */
    public static String encodeImgBase64(String filePath){
        return encodeBase64(FileIOUtils.readFile2BytesByStream(filePath));//压缩后的路径

    }

    public static String encodeBase64(byte[] input){
        return input == null ? null :new String(Base64.encode(input, Base64.DEFAULT));
    }

    public static boolean decoderBase64Image(String imgSourceStr, String buildImgPath) {   //对字节数组字符串进行Base64解码并生成图片
        if (imgSourceStr == null) //图像数据为空
            return false;

        byte[] bitmapArray = Base64.decode(imgSourceStr, Base64.DEFAULT);
        return FileIOUtils.writeFileFromBytesByChannel(buildImgPath, bitmapArray, true);
    }


    //TODO method 2
    public static String encodeImgBase64Two(String filePath){
        byte[] bytes = FileIOUtils.readFile2BytesByStream(filePath);
        if (bytes == null) {
            return null;
        }
        return new BASE64Encoder().encode(bytes);
    }

    //base64字符串转化成图片
    public static boolean decoderBase64ImageTwo(String imgSourceStr, String buildImgPath) {   //对字节数组字符串进行Base64解码并生成图片
        if (imgSourceStr == null) //图像数据为空
            return false;
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            //Base64解码
            byte[] b = decoder.decodeBuffer(imgSourceStr);
            for(int i=0;i<b.length;++i)
            {
                if(b[i]<0)
                {//调整异常数据
                    b[i]+=256;
                }
            }
            //生成jpeg图片
            String imgFilePath = buildImgPath;//新生成的图片
            OutputStream out = new FileOutputStream(imgFilePath);
            out.write(b);
            out.flush();
            out.close();
            return true;
        }
        catch (Exception e) {
            return false;
        }
    }
}
